package org.shj.pattern.memento

/**
 * 在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态
 * 主要解决： 使对象恢复到保存前的状态
 * 应用场景： 1. 后悔药  2. 打游戏时存档   3. Windows里的ctrl+z 4. 数据库事务管理 等
 * 缺点： 消耗资源。如果类的成员变量过多，势必会占用比较大的资源。
 */
object MementoMain {
  def main(args: Array[String]): Unit = {
    val ori = new Originator(100, 100)
    val caretaker = new CareTaker()
    
    //一路过关斩将后
    ori.curHealth = 30
    ori.curMagic = 50
    
    //碰到了boss，赶紧存档
    caretaker.add("关卡一", ori.saveState())
    
    //被boss杀了
    ori.curHealth = 0
    ori.curMagic = 0    
    println(ori)
    
    //恢复到杀boss时的状态
    ori.recover(caretaker.get("关卡一"))
    println(ori)
  }
}